# 位置参数
def powr(x, n):
    s = x ** n
    return s


print(powr(5, 2))


# 默认参数
def powr(x, n=3):  # 变化大的参数在前，变化小的参数在后，必选参数在前，默认参数在后
    s = x ** n
    return s


print(powr(5))


# 可变参数：个数可变的位置参数(只能一个),与定义一个list或tuple相比仅在参数前使用*，函数调用时自动组装为一个tuple
# eg1
def add_end(l=None):  # 定义默认参数，默认参数必须指向不变参数
    if l is None:
        l = []
    l.append('end')
    return l


print(add_end([1, 2]))


# eg2
def calc(*numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum


print(calc(1, 2))
lst = [10, 5]
print(calc(*lst))


# 关键字参数：**个数可变的关键字参数允许传入n个含参数名的参数，这些关键字在函数内部自动组装为一个dict
def person(name, age, **kw):
    print('name:', name, 'age:', age, 'other:', kw)


extra = {'city': 'Beijing', 'job': 'engineer'}
print(person("jack", 24, **extra))


# 命名关键字参数：*后面的参数是命名关键字参数
def person(name, age, *, city):  # 命名关键字参数可以有缺省值---def person(name,age,*，job="worker",city='PK'):
    print(name, age, city)


print(person("lucy", 20, city='New York'))


# 参数组合
def f1(a, b, c=0, *args, **kw):
    print('a=', a, 'b=', b, 'c=', c, 'args=', args, 'kw=', kw)


print(f1(1, 8, 6, 'python', y=7))
